% Practica 1 SC - Apartado 1

clear all;
clc;
format long;

% Ejemplo 1
%entrada = [-4 3;1 2]; % por columnas
%salidaDeseada = [5 -2];

% Ejemplo 2
%entrada = [3 -6;-2 4];
%salidaDeseada = [1 -2];

% Ejemplo 3
%entrada = [2 5;7 -1];
%salidaDeseada = [4 2];

% Ejemplo 4
%entrada = [-5 1.5;2 -3];
%salidaDeseada = [5 -2];

%Ejemplo 5
%entrada = [3 -2 -4 ;1 1 2];
%salidaDeseada = [5 -1 -2];

%Ejemplo 6
entrada = [3 -4;2 1];
salidaDeseada = [-2 5];

ErrorMaximo = 0.0001;

% Inicializacion aleatoria de los pesos
w1 = rand;
w2 = rand;
v = 0.01; % Velocidad de aprendizaje

% Entrenamiento de la red
i = 1;
error1 = (salidaDeseada(1) - (entrada(1,1)*w1 + entrada(2,1)*w2));
error2 = (salidaDeseada(2) - (entrada(1,2)*w1 + entrada(2,2)*w2));
%error3 = (salidaDeseada(3) - (entrada(1,3)*w1 + entrada(2,3)*w2)); % Caso
%de patrones tridimensionales
peso1(i) = w1;
peso2(i) = w2;
ECM(i) = 0.5*(error1^2 + error2^2);
%ECM(i) = 0.5*(error1^2 + error2^2 + error3^2);


while ((ErrorMaximo <= ECM(i)) && (i <= 10000)), %Revisar
    i = i + 1;
    
    % Nuevos pesos para la primera componente de cada patron:
    dW1 = (2*v*error1*entrada(1,1) + 2*v*error2*entrada(1,2))/2;
    %dW1 = (2*v*error1*entrada(1,1) + 2*v*error2*entrada(1,2) + 2*v*error3*entrada(1,3))/3;
    w1 = w1 + dW1;

    % Nuevos pesos para la segunda componente de cada patron:
    dW2 = (2*v*error1*entrada(2,1) + 2*v*error2*entrada(2,2))/2;
    %dW2 = (2*v*error1*entrada(2,1) + 2*v*error2*entrada(2,2) + 2*v*error3*entrada(2,3))/3;
    w2 = w2 + dW2;

    % Calculo de los errores:
    error1 = (salidaDeseada(1) - (entrada(1,1)*w1 + entrada(2,1)*w2));
    error2 = (salidaDeseada(2) - (entrada(1,2)*w1 + entrada(2,2)*w2));
    %error3 = (salidaDeseada(3) - (entrada(1,3)*w1 + entrada(2,3)*w2));
    
    peso1(i) = w1;
    peso2(i) = w2;
    ECM(i) = 0.5 *(error1^2 + error2^2);
    %ECM(i) = 0.5*(error1^2 + error2^2 + error3^2);
    
end

w1
w2

% Representaciones Graficas

% Representacion 3D
[P1,P2] = meshgrid(-5:0.1:5);
ecm = (1/2)*((salidaDeseada(1)-(entrada(1,1)*P1+entrada(2,1)*P2)).^2 + (salidaDeseada(2)-(entrada(1,2)*P1+entrada(2,2)*P2)).^2);
%ecm = (1/2)*((salidaDeseada(1)-(entrada(1,1)*P1+entrada(2,1)*P2)).^2 + (salidaDeseada(2)-(entrada(1,2)*P1+entrada(2,2)*P2)).^2 + (salidaDeseada(3)-(entrada(1,3)*P1+entrada(2,3)*P2)).^2);
figure(1) % Subgraficas
subplot(221); %3D
plot3(peso1,peso2,ECM,'r-');
hold on;
mesh(P1,P2,ecm);
title('Representacion 3D de la superficie de error en funcion de los pesos');
hold off
grid;
subplot(222); %2D
contour(P1,P2,ecm);
hold on;
plot(peso1,peso2,'r*');
title('Representacion 2D de la superficie de error en funcion de los pesos');
hold off;
grid;
subplot(223); %Evolucion error
plot(ECM,'r');
xlabel('Iteracion');
ylabel('Valor error');
title('Variacion del error respecto al tiempo');
grid;

% Evolucion de los pesos:
figure(2); % Graficas superpuestas de las evoluciones de los pesos
plot(peso1,'g');
title('Evolucion de los pesos');
xlabel('Iteracion');
ylabel('Valor del peso');
hold on
plot(peso2,'b--');
legend('w1','w2');
hold off;

% Grafica 3D superpuesta con ECM
%figure(1); 
%plot3(peso1,peso2,ECM,'r');
%hold on;
%mesh(P1,P2,ecm)
%hold off

% Representacion 2D superpuesta con ECM
%figure(2);
%contour(P1,P2,ecm);
%hold on;
%plot(peso1,peso2,'r');
%title('Representacion 2D de la superficie de error');
%xlabel('w1');
%ylabel('w2');
%hold off;

%figure(3);
%plot(ECM,'r');
%xlabel('Iteracion');
%ylabel('Valor error');
%title('Variacion del error respecto al tiempo');